async function t1() {
  // 按照语法规定，await等待的是一个表达式，这个表达式的计算结果是Promise对象或者其它值（换句话说，就是没有特殊限定）
  // await等的是一个结果，这个结果可能是promise对象，也可能是函数的返回值或者一个表达式的计算值等等
  let a = await 'lagou';
  // -> lagou
  console.log(a);
}

t1();

async function t2() {
  // 如果await后面等的是一个promise对象，那就会阻塞后面的代码，等待Promise对象的resolve，然后得到resolve的值，作为
  // await表达式的运算结果
  // await后面的是一个Promise对象，而这个对象一直处于pending状态，因此函数里面后面的代码会被一直阻塞，但是主线程和其它线程都没有任务，nodejs进程也会自动
  // 退出
  let a = await new Promise(resolve => {});
  console.log(a);
}

t2();
console.log(t2());
// 注意：async函数的调用不会造成阻塞，它内部所有的阻塞都被封装在一个Promise对象中异步执行。
// 因此是优先执行的
console.log(123);
async function t3() {
  // resolve(undefined)
  let a = await new Promise(resolve => resolve());
  // -> undefined
  console.log(a);
}
t3();

async function t4() {
  // resolve('hello')
  let a = await new Promise(resolve => resolve('hello'));
  // -> hello
  console.log(a);
}

t4();

async function t5() {
  // await等待的是一个Promise对象，一旦Promise的对象状态变成了fullFilled，就返回resolve的值
  let a = await new Promise(resolve => resolve('hello')).then(() => 'lala');
  // -> lagou
  console.log(a);
}

async function t6() {
  // fn是一个async函数，返回的是一个Promise对象，由于fn本身没有显式的返回值，就相当于是resolve(undefined)
  let a = await fn().then(res => res);
  // -> undefined
  console.log(a);
}
async function fn() {
  await new Promise(resolve => {
    resolve('lagou');
  });
}

t6();

async function t7() {
  // fn1显式的返回了'lala'，就相当于resolve('lala')
  let a = await fn1().then(res => res);
  // -> lala
  console.log(a);
}
async function fn1() {
  await new Promise(resolve => {
    resolve('lagou');
  });
  return 'lala';
}

t7();
